/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MODELO;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author O2
 */
public class DAOEntidadUsuario extends ManejadorBaseDatos implements IDAOPersistencia {

    public DAOEntidadUsuario() throws Exception {
        super();
    }

    public DAOEntidadUsuario(String driver, String servidor, String url, String usuarioBD, String passwordUsuarioBD, String nombreBD) throws Exception {
        super(driver, servidor, url, usuarioBD, passwordUsuarioBD, nombreBD);
    }

    public DAOEntidadUsuario(int puertoServidorBD, String nombreIPServidorBD, String driver, String url, String usuarioBD, String passwordUsuarioBD, String nombreBD) throws Exception {
        super(puertoServidorBD, nombreIPServidorBD, driver, url, usuarioBD, passwordUsuarioBD, nombreBD);
    }

    public int contar_usuario(int cod_distrito) {
        int rpta = 0;
        try {
            ResultSet prueba;
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = getConexion().prepareCall(" CALL usuario_contar(?) ");
            proc.setInt("cod_distrito", cod_distrito);//Tipo SInt
            prueba = proc.executeQuery();
            while (prueba.next()) {
                rpta = Integer.parseInt(prueba.getString("COUNT(*)"));
            }
        } catch (SQLException | NumberFormatException e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    
    public String tema(int id_Usuario) {
        String rpta = "";
        try {
            ResultSet prueba;
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = getConexion().prepareCall(" CALL usuario_tema(?) ");
            proc.setInt("pid_Usuario", id_Usuario);//Tipo SInt
            prueba = proc.executeQuery();
            while (prueba.next()) {
                rpta = prueba.getString("tema");
            }
        } catch (SQLException | NumberFormatException e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    
    public int tema_modificar(int pid_Usuario,String ptema) throws Exception {
        int rpta=0;
        try {
            Connection conn = getConexion();
            CallableStatement proc = conn.prepareCall(" CALL tema_modificar(?,?)");
            //se cargan los parametros de entrada
            proc.setInt("pid_Usuario", pid_Usuario);//Tipo int
            proc.setString("ptema", ptema);//Tipo String
            if (proc.execute()) {
                rpta = 1;
            } else {
                rpta = 0;
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    

    public int [] loguear2(IEntidad objeto) throws Exception {
        int [] rpta = new int [3];
        ResultSet prueba;
        EntidadUsuario usuario1 = (EntidadUsuario) objeto;
        Connection conn = getConexion();
        try {
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = conn.prepareCall(" CALL logueo(?,?) ");
            //se cargan los parametros de entrada
            proc.setString("pnombre_User", usuario1.getNom_Usuario());//Tipo String
            proc.setString("pcontrasenia", usuario1.getContrasenia());//Tipo String
            
            // Se ejecuta el procedimiento almacenado
            //OJO con esta validacion, parece q esta mal  
            prueba = proc.executeQuery();
            while (prueba.next()) {
                rpta[0] = Integer.parseInt(prueba.getString("tipo_cuenta"));
                rpta[1]= Integer.parseInt(prueba.getString("id_Usuario"));
                rpta[2]= Integer.parseInt(prueba.getString("idUnidadEjec"));
            }
        } catch (SQLException | NumberFormatException e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    
    public DefaultTableModel getTablaUsuario(int Distrito_id_distrito) {
        DefaultTableModel tablemodel = new DefaultTableModel();
        String[] columNames = {"DNI", "NOMBRE", "APELLIDO PAT..", "APELLIDO MAT.", "FECHA NAC.", "TELÉFONO", "CARGO", "SEXO", "DIRECCIÓN", "USUARIO", "PREGUNTA SECRET.", "RESPUESTA SECRET.", "EMAIL", "ESTADO", "TIPO DE CUENTA"};
        //se crea una matriz con tantas filas y columnas que necesite
        Object[][] data = new String[contar_usuario(Distrito_id_distrito)][16];
        try {
            conectar();
            //realizamos la consulta sql y llenamos los datos en la matriz "Object[][] data"
            CallableStatement pstm = this.getConexion().prepareCall("CALL usuario_listar_admin(?)");
            pstm.setInt("cod_distrito", Distrito_id_distrito);//Tipo Int
            ResultSet res = pstm.executeQuery();
            int i = 0;
            while (res.next()) {
                data[i][0] = res.getString("DNI");
                data[i][1] = res.getString("nombre");
                data[i][2] = res.getString("apellido_Pat");
                data[i][3] = res.getString("apellido_Mat");
                data[i][4] = res.getString("fecha_nac");
                data[i][5] = res.getString("telefono");
                data[i][6] = res.getString("cargo");
                data[i][7] = res.getString("sexo");
                data[i][8] = res.getString("direccion");
                data[i][9] = res.getString("nombre_User");
                data[i][10] = res.getString("pregunta_secret");
                data[i][11] = res.getString("respuesta_secret");
                data[i][12] = res.getString("email");
                data[i][13] = res.getString("estado");
                data[i][14] = res.getString("tipo_cuenta");
                i++;
            }
            res.close();
            //se añade la matriz de datos en el DefaultTableModel
            tablemodel.setDataVector(data, columNames);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        desconectar();
        return tablemodel;
    }

    @Override
    public int insertar(IEntidad objeto) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int borrar(String condicion) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int modificar(IEntidad objeto) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
